#include "comm.hpp"

int main()
{
    key_t k = getKey();
    printf("0x%x\n",k);

    int shmid = getShm(k);
    printf("shmid: %d\n", shmid);
    //到这一步一定是共享内存创建成功了，因为在getKey()getShm()各自函数内部都进行了查错处理。

    // sleep(5);

    char *start = (char*)attachshm(shmid);//让进程和共享内存进行挂接，返回共享内存的起始地址
    printf("attach success, address start: %p\n", start);

    const char *message = "hello server, I am another process that communicating with you";
    int cnt = 1;
    pid_t id = getpid();
    while(true)
    {
        //pid, count, message -> 拼接成string发给server
        //我们直接就把共享内存当作buffer进行使用，因为这里的共享内存地址是虚拟地址，看作用户层的缓冲区。
        //不会像write一样先将数据写到用户级缓冲区中，然后在转移到内核缓冲区里，而是直接将数据搞到物理内存上
        snprintf(start,MAX_SIZE-1,"%s[pid(%d)][消息编号:%d]",message, id, cnt++);
        //防御式编程，给start的空间留一个\0，我们把这个空间当作字符串空间看待了。
        sleep(5);//每隔5s写一条消息
    }

    // sleep(5);

    detachshm(start);

    // sleep(5);

    // delShm(shmid); 删除共享内存是server端做的事情
    return 0;
}